// 要重写的数组方法7个 push shift unshift pop reverse sort splice 这些会导致数组本身发生变化的方法
// slice() 就不会改变数组本身

// 拿到数组原来的所有方法
let oldArrayMethods = Array.prototype

// Object.create 能把 arrayMethods.__proto__ = oldArrayMethods
// 原型链查找问题 value.__proto__ > arrayMethods > arrayMethods.__proto__ > oldArrayMethods
export let arrayMethods = Object.create(oldArrayMethods)

const methods = [
  "push",
  "shift",
  "unshift",
  "pop",
  "reverse",
  "sort",
  "splice"
]

// 切片编程 AOP
methods.forEach(method => {
  arrayMethods[method] = function (...args) {
    console.log('用户调用了数组方法')
    const result = oldArrayMethods[method].apply(this, args) // 调用了原生的数组方法
    // 如果新增了对象可以对新的对象进行监控
    let inserted // 当前用户插入的对象
    let ob = this.__ob__
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args
        break;
      case 'splice':
        inserted = args.slice(2)
        break;
      default:
        break;
    }
    if (inserted) ob.observeArray(inserted) 
    return result
  }
})